//package com.erp.user.service.impl;
//
//import cn.hutool.core.bean.BeanUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.erp.user.domain.*;
//import com.erp.user.domain.bo.ErpDistributePropBo;
//import com.erp.user.domain.param.ErpDistributePropDto;
//import com.erp.user.domain.vo.ErpDistributePropVo;
//import com.erp.user.mapper.ErpDistributePropMapper;
//import com.erp.user.mapper.ErpPromotionLogMapper;
//import com.erp.user.service.*;
//import com.ruoyi.common.core.enums.ExpenseType;
//import com.ruoyi.common.core.enums.FlowType;
//import com.ruoyi.common.core.enums.PayType;
//import com.ruoyi.wallet.api.RemoteWalletService;
//import com.ruoyi.common.core.domain.PageQuery;
//import com.ruoyi.common.core.utils.oldUtils.StringUtils;
//import com.ruoyi.common.core.web.oldPage.TableDataInfo;
//import lombok.RequiredArgsConstructor;
//import org.springframework.scheduling.annotation.Async;
//import org.springframework.stereotype.Service;
//
//import java.math.BigDecimal;
//import java.util.Collection;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
///**
// * ERP分销比例配置Service业务层处理
// *
// * @author erp
// * @date 2023-05-11
// */
//@RequiredArgsConstructor
//@Service
//public class ErpDistributePropServiceImpl implements IErpDistributePropService {
//
//	private final ErpDistributePropMapper baseMapper;
//	private final IErpBranchOfficeInfoService iErpBranchOfficeInfoService;
//	private final IErpAgentInfoService iErpAgentInfoService;
//	private final IErpUserInfoService iErpUserInfoService;
//	private final IErpBonusPoolService iErpBonusPoolService;
//	private final RemoteWalletService iErpSellerStoreWalletService;
//	private final ErpPromotionLogMapper erpPromotionLogMapper;
//	private final IErpPromotionCommissionLogService erpPromotionCommissionLogService;
//	/**
//	 * 查询ERP分销比例配置
//	 */
//	@Override
//	public ErpDistributePropVo queryById(Long id) {
//		return baseMapper.selectVoById(id);
//	}
//
//	/**
//	 * 查询ERP分销比例配置列表
//	 */
//	@Override
//	public TableDataInfo<ErpDistributePropVo> queryPageList(ErpDistributePropBo bo, PageQuery pageQuery) {
//		LambdaQueryWrapper<ErpDistributeProp> lqw = buildQueryWrapper(bo);
//		Page<ErpDistributePropVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
//		return TableDataInfo.build(result);
//	}
//
//	/**
//	 * 查询ERP分销比例配置列表
//	 */
//	@Override
//	public List<ErpDistributePropVo> queryList(ErpDistributePropBo bo) {
//		LambdaQueryWrapper<ErpDistributeProp> lqw = buildQueryWrapper(bo);
//		return baseMapper.selectVoList(lqw);
//	}
//
//	private LambdaQueryWrapper<ErpDistributeProp> buildQueryWrapper(ErpDistributePropBo bo) {
//		Map<String, Object> params = bo.getParams();
//		LambdaQueryWrapper<ErpDistributeProp> lqw = Wrappers.lambdaQuery();
//		lqw.eq(bo.getId() != null, ErpDistributeProp::getId, bo.getId());
//		lqw.eq(bo.getType() != null, ErpDistributeProp::getType, bo.getType());
//		lqw.eq(bo.getDirectProp() != null, ErpDistributeProp::getDirectProp, bo.getDirectProp());
//		lqw.eq(bo.getLevelProp() != null, ErpDistributeProp::getLevelProp, bo.getLevelProp());
//		lqw.eq(bo.getBonusPool() != null, ErpDistributeProp::getBonusPool, bo.getBonusPool());
//		lqw.eq(StringUtils.isNotBlank(bo.getRevision()), ErpDistributeProp::getRevision, bo.getRevision());
//		return lqw;
//	}
//
//	/**
//	 * 新增ERP分销比例配置
//	 */
//	@Override
//	public Boolean insertByBo(ErpDistributePropBo bo) {
//		ErpDistributeProp add = BeanUtil.toBean(bo, ErpDistributeProp.class);
//		validEntityBeforeSave(add);
//		boolean flag = baseMapper.insert(add) > 0;
//		if (flag) {
//			bo.setId(add.getId());
//		}
//		return flag;
//	}
//
//	/**
//	 * 修改ERP分销比例配置
//	 */
//	@Override
//	public Boolean updateByBo(ErpDistributePropBo bo) {
//		ErpDistributeProp update = BeanUtil.toBean(bo, ErpDistributeProp.class);
//		validEntityBeforeSave(update);
//		return baseMapper.updateById(update) > 0;
//	}
//
//	/**
//	 * 保存前的数据校验
//	 */
//	private void validEntityBeforeSave(ErpDistributeProp entity) {
//		// TODO 做一些数据校验,如唯一约束
//	}
//
//	/**
//	 * 批量删除ERP分销比例配置
//	 */
//	@Override
//	public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
//		if (isValid) {
//			// TODO 做一些业务上的校验,判断是否需要校验
//		}
//		return baseMapper.deleteBatchIds(ids) > 0;
//	}
//
//	@Override
//	public ErpDistributePropDto selectProp() {
//
//		ErpDistributePropDto dto = new ErpDistributePropDto();
//
//		// 获取全部
//		List<ErpDistributeProp> list = baseMapper.selectList();
//		list.forEach(prop -> {
//			if (prop.getType().equals(1)) { // 分公司
//				dto.setBranchDirectProp(prop.getDirectProp());
//				dto.setBranchBonusPool(prop.getBonusPool());
//				dto.setBranchLevelProp(prop.getLevelProp());
//			} else if (prop.getType().equals(2)) { // 代理
//				dto.setAgentDirectProp(prop.getDirectProp());
//				dto.setAgentBonusPool(prop.getBonusPool());
//				dto.setAgentLevelProp(prop.getLevelProp());
//			} else if (prop.getType().equals(3)) { // 个人
//				dto.setPersonDirectProp(prop.getDirectProp());
//				dto.setPersonLevelProp(prop.getLevelProp());
//			}
//		});
//
//		return dto;
//	}
//
//	@Override
//	public Boolean updateProp(ErpDistributePropDto dto) {
//
//		// 获取全部
//		List<ErpDistributeProp> list = baseMapper.selectList();
//		list.forEach(prop -> {
//			if (prop.getType().equals(1)) { // 分公司
//				prop.setDirectProp(dto.getBranchDirectProp());
//				prop.setBonusPool(dto.getBranchBonusPool());
//				prop.setLevelProp(dto.getBranchLevelProp());
//			} else if (prop.getType().equals(2)) { // 代理
//				prop.setDirectProp(dto.getAgentDirectProp());
//				prop.setBonusPool(dto.getAgentBonusPool());
//				prop.setLevelProp(dto.getAgentLevelProp());
//			} else if (prop.getType().equals(3)) { // 个人
//				prop.setDirectProp(dto.getPersonDirectProp());
//				prop.setLevelProp(dto.getPersonLevelProp());
//			}
//		});
//		boolean bool = baseMapper.updateBatchById(list);
//		return bool;
//	}
//
//	/**
//	 * 分佣
//	 *
//	 * @param userId        被推广用户id
//	 * @param userType      被推广用户类型（1分公司 2代理 3个人）
//	 * @param recommendTime 推荐时间
//	 * @param userCode      推荐客户编码
//	 * @param amount        金额
//	 * @param isDivide      是否分佣 0否 1是
//	 * @param orderNo       订单号
//	 */
//	@Async
//	@Override
//	public void divide(Long userId, Integer userType, Date recommendTime, String userCode, BigDecimal amount,
//			Integer isDivide, String orderNo) {
//
//		Integer divideStatus = null;
//		Long branchId = null;
//		Long agentId = null;
//		Long personId = null;
//		// 判断是否分佣
//		if (StringUtils.isNotEmpty(userCode)) { // 分佣且推荐客户编码不为空
//			// 获取分佣比例
//			ErpDistributePropDto prop = selectProp();
//			// 根据推荐客户编码获取推荐人
//			if (userCode.startsWith("G")) { // 分公司
//				ErpBranchOfficeInfo branchOfficeInfo = iErpBranchOfficeInfoService.selectByCode(userCode);
//				branchId = branchOfficeInfo.getId();
//				//修改--by0803 li
//					try {
//						branchDivide(userId, userType, recommendTime, userCode,isDivide,amount, branchOfficeInfo, prop, 1, orderNo);
//						divideStatus = 1;
//					} catch (Exception e) {
//						divideStatus = 0;
//					}
//			} else if (userCode.startsWith("D")) { // 代理
//				ErpAgentInfo agentInfo = iErpAgentInfoService.selectByCode(userCode);
//				agentId = agentInfo.getId();
//				branchId = Long.valueOf(agentInfo.getBranchId());
//				//修改--by0803 li
//					try {
//						agentDivide(userId, userType, recommendTime, userCode,isDivide,amount, agentInfo, prop, 1, orderNo);
//						divideStatus = 1;
//					} catch (Exception e) {
//						divideStatus = 0;
//					}
//			} else {
//				ErpUserInfo userInfo = iErpUserInfoService.selectByCode(userCode);
//				personId = userInfo.getId();
//				agentId = Long.valueOf(userInfo.getAgentId());
//				branchId = Long.valueOf(userInfo.getBranchId());
//				//修改--by0803 li
//					try {
//						personDivide(userId, userType, recommendTime, userCode,isDivide,amount, userInfo, prop, 1, orderNo);
//						divideStatus = 1;
//					} catch (Exception e) {
//						divideStatus = 0;
//					}
//			}
//		}
//
//		// 保存推广日志
//		ErpPromotionLog log = new ErpPromotionLog();
//
//		log.setUserId(userId); // 被推广用户id
//		log.setUserType(userType); // 被推广用户类型
//		log.setRecommendCode(userCode); // 推广客户编码
//		log.setRecommendTime(recommendTime); // 推广时间
//		log.setAmount(amount); // 推广金额
//
//		log.setBranchId(branchId); // 分公司id
//		log.setAgentId(agentId); // 代理id
//		log.setPersonId(personId); // 个人id
//
//		log.setIsDivide(isDivide); // 是否分佣
//		log.setDivideStatus(divideStatus); // 分佣状态
//
//		erpPromotionLogMapper.insert(log);
//
//	}
//
//	public void branchDivide(Long userId, Integer userType, Date recommendTime, String userCode,Integer isDivide,BigDecimal amount, ErpBranchOfficeInfo branchOfficeInfo, ErpDistributePropDto prop,
//			Integer type, String orderNo) {
//
//		BigDecimal hundred = BigDecimal.valueOf(100);
//
//		if (type.equals(1)) { // 级差奖
//			// 分佣比例
//			BigDecimal branchDirectProp = prop.getBranchDirectProp();
//			// TODO 创建推广提成日志
//			//计算提成金额
//			BigDecimal commAmount=amount.multiply(branchDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(branchOfficeInfo.getUserId(),commAmount,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			//是否分佣 0否 1是
//			if(isDivide.equals(1)){
//				// 获取是否加入奖金池
//				Integer bonusPool = branchOfficeInfo.getBonusPool();
//				if (bonusPool.equals(1)) { // 加入
//					// 计算金额加入
//					BigDecimal bonusPoolAmount = amount.multiply(prop.getBranchBonusPool()).divide(hundred, 2,
//							BigDecimal.ROUND_HALF_EVEN);
//					// 保存到奖金池
//					iErpBonusPoolService.save(branchOfficeInfo.getUserId(), bonusPoolAmount, 1);
//
//					// 加入到奖金池后，分佣比例减去奖金池的比例，得到最后的分佣比例
//					branchDirectProp = branchDirectProp.subtract(bonusPoolAmount);
//				}
//					// 分佣金额存入钱包
//					if (branchDirectProp.compareTo(BigDecimal.ZERO) == 1) { // 当前分佣比例大于0
//						amount = amount.multiply(branchDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//						iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//								PayType.XT.getCode(), amount, branchOfficeInfo.getUserId(), orderNo, "");
//					}
//			}
//		} else { // 平级奖
//			// 平级比例
//			BigDecimal branchLevelProp = prop.getBranchLevelProp();
//			amount = amount.multiply(branchLevelProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(branchOfficeInfo.getUserId(),amount,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			//是否分佣 0否1是
//			if(isDivide.equals(1)){
//				// 判断是否大于等于10元，大于等于就存入钱包，小于就不存了，结束
//				if (amount.compareTo(BigDecimal.valueOf(10)) != -1) {
//					iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//							PayType.XT.getCode(), amount, branchOfficeInfo.getUserId(), orderNo, "");
//				} else {
//					return;
//				}
//			}
//		}
//
//		// 获取推广人
//		String parentId = branchOfficeInfo.getParentId();
//		if (StringUtils.isNotEmpty(parentId)) {
//			// 获取推荐人
//			branchOfficeInfo = iErpBranchOfficeInfoService.selectById(Long.valueOf(parentId));
//			branchDivide(userId, userType, recommendTime, userCode,isDivide,amount, branchOfficeInfo, prop, 2, orderNo);
//		}
//	}
//
//	public void agentDivide(Long userId, Integer userType, Date recommendTime, String userCode, Integer isDivide,BigDecimal amount, ErpAgentInfo agentInfo, ErpDistributePropDto prop, Integer type,
//			String orderNo) {
//		BigDecimal hundred = BigDecimal.valueOf(100);
//		BigDecimal pingji = BigDecimal.ZERO;
//
//		if (type.equals(1)) { // 级差奖
//			// 分佣比例
//			BigDecimal agentDirectProp = prop.getAgentDirectProp();
//			pingji = amount.multiply(agentDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(agentInfo.getUserId(),pingji,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			//是否分佣 0否1是
//			if(isDivide.equals(1)){
//				// 获取是否加入奖金池
//				Integer bonusPool = agentInfo.getBonusPool();
//				if (bonusPool.equals(1)) { // 加入
//					// 计算金额加入
//					BigDecimal bonusPoolAmount = amount.multiply(prop.getBranchBonusPool()).divide(hundred, 2,
//							BigDecimal.ROUND_HALF_EVEN);
//					// 保存到奖金池
//					iErpBonusPoolService.save(agentInfo.getUserId(), bonusPoolAmount, 1);
//
//					// 加入到奖金池后，分佣比例减去奖金池的比例，得到最后的分佣比例
//					agentDirectProp = agentDirectProp.subtract(bonusPoolAmount);
//				}
//
//					// 分佣金额存入钱包
//					if (agentDirectProp.compareTo(BigDecimal.ZERO) == 1) { // 当前分佣比例大于0
//						BigDecimal yongjin = amount.multiply(agentDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//						iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//								PayType.XT.getCode(), yongjin, agentInfo.getUserId(), orderNo, "");
//					}
//			}
//
//			// 获取分公司
//			String branchId = agentInfo.getBranchId();
//			if (StringUtils.isNotEmpty(branchId)) { // 不为空，就计算级差奖
//				BigDecimal branchDirectProp = prop.getBranchDirectProp();
//				branchDirectProp = branchDirectProp.subtract(prop.getAgentDirectProp());
//				prop.setBranchDirectProp(branchDirectProp);
//
//				ErpBranchOfficeInfo branchOfficeInfo = iErpBranchOfficeInfoService.selectById(Long.valueOf(branchId));
//				// 调用
//				branchDivide(userId, userType, recommendTime, userCode, isDivide,amount, branchOfficeInfo, prop, 1, orderNo);
//			}
//		} else { // 平级奖
//			// 平级比例
//			BigDecimal branchLevelProp = prop.getBranchLevelProp();
//			pingji = amount.multiply(branchLevelProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(agentInfo.getUserId(),pingji,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			if(isDivide.equals(1)){
//				// 判断是否大于等于10元，大于等于就存入钱包，小于就不存了，结束
//				if (pingji.compareTo(BigDecimal.valueOf(10)) != -1) {
//					iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//							PayType.XT.getCode(), pingji, agentInfo.getUserId(), orderNo, "");
//				} else {
//					return;
//				}
//			}
//
//		}
//
//		// 获取推广人
//		String parentId = agentInfo.getParentId();
//		if (StringUtils.isNotEmpty(parentId)) {
//			// 获取推荐人
//			agentInfo = iErpAgentInfoService.selectById(Long.valueOf(parentId));
//			agentDivide(userId, userType, recommendTime, userCode, isDivide,pingji, agentInfo, prop, 2, orderNo);
//		}
//	}
//
//	public void personDivide(Long userId, Integer userType, Date recommendTime, String userCode,Integer isDivide, BigDecimal amount, ErpUserInfo userInfo, ErpDistributePropDto prop, Integer type,
//			String orderNo) {
//		BigDecimal hundred = BigDecimal.valueOf(100);
//		BigDecimal pingji = BigDecimal.ZERO;
//
//		if (type.equals(1)) { // 级差奖
//			// 分佣比例
//			BigDecimal personDirectProp = prop.getPersonDirectProp();
//			//计算提成奖金
//			BigDecimal commAomunt=amount.multiply(personDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(userInfo.getUserId(),commAomunt,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			if(isDivide.equals(1)){
//				// 分佣金额存入钱包
//				if (personDirectProp.compareTo(BigDecimal.ZERO) == 1) { // 当前分佣比例大于0
//					pingji = amount.multiply(personDirectProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//					iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//							PayType.XT.getCode(), pingji, userInfo.getUserId(), orderNo, "");
//				}
//			}
//
//			// 获取有无代理
//			String agentId = userInfo.getAgentId();
//			String branchId = userInfo.getBranchId();
//			if (StringUtils.isNotEmpty(agentId)) {
//				// 计算分公司的比例
//				BigDecimal branchDirectProp = prop.getBranchDirectProp();
//				branchDirectProp = branchDirectProp.subtract(prop.getPersonDirectProp());
//				prop.setBranchDirectProp(branchDirectProp);
//				// 计算代理的比例
//				BigDecimal agentDirectProp = prop.getAgentDirectProp();
//				agentDirectProp = agentDirectProp.subtract(prop.getPersonDirectProp());
//				prop.setAgentDirectProp(agentDirectProp);
//
//				ErpAgentInfo agentInfo = iErpAgentInfoService.selectById(Long.valueOf(agentId));
//				// 调用
//				agentDivide(userId, userType, recommendTime, userCode, isDivide,amount, agentInfo, prop, 1, orderNo);
//			} else if (StringUtils.isNotEmpty(branchId)) {
//				BigDecimal branchDirectProp = prop.getBranchDirectProp();
//				branchDirectProp = branchDirectProp.subtract(prop.getPersonDirectProp());
//				prop.setBranchDirectProp(branchDirectProp);
//
//				ErpBranchOfficeInfo branchOfficeInfo = iErpBranchOfficeInfoService.selectById(Long.valueOf(branchId));
//				// 调用
//				branchDivide(userId, userType, recommendTime, userCode, isDivide,amount, branchOfficeInfo, prop, 1, orderNo);
//			}
//
//		} else { // 平级奖
//			// 平级比例
//			BigDecimal branchLevelProp = prop.getBranchLevelProp();
//			pingji = amount.multiply(branchLevelProp).divide(hundred, 2, BigDecimal.ROUND_HALF_EVEN);
//			//创建提成日志记录
//			erpPromotionCommissionLogService.insertPromotionCommissionLog(userInfo.getUserId(),pingji,userId,userType,recommendTime,userCode,isDivide,orderNo);
//			//是否分佣 0否1是
//			if(isDivide.equals(1)){
//				// 判断是否大于等于10元，大于等于就存入钱包，小于就不存了，结束
//				if (pingji.compareTo(BigDecimal.valueOf(10)) != -1) {
//					iErpSellerStoreWalletService.updateWallet(FlowType.INCOME.getCode(), ExpenseType.COMMISSION.getCode(),
//							PayType.XT.getCode(), pingji, userInfo.getUserId(), orderNo, "");
//				} else {
//					return;
//				}
//			}
//
//		}
//
//		// 获取推广人
//		String parentId = userInfo.getParentId();
//		if (StringUtils.isNotEmpty(parentId)) {
//			// 获取推荐人
//			userInfo = iErpUserInfoService.selectById(Long.valueOf(parentId));
//			personDivide(userId, userType, recommendTime, userCode, isDivide,pingji, userInfo, prop, 2, orderNo);
//		}
//	}
//}
